home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 22 / Cream of the Crop 22.iso / program / asm32.zip / E32.ZIP / SWITCH.ASM < prev    next >
Assembly Source File  |  1996-03-30  |  3KB  |  170 lines

  1. ; SWITCH.ASM for E32 - Copyright (C) 1994 - 1996 Douglas Herr
  2. ;  all rights reserved
  3.  
  4. ; 01/18/1996 DH: changed PICKSTR calls to PICKSTRING
  5.  
  6. include    model.inc
  7.  
  8. public    switch, swap_files, swapmode
  9. public    window_row
  10.  
  11. extrn    showfkey:near
  12. extrn    two_mon:near
  13. extrn    file_data_len:abs, number_of_files:abs
  14. extrn    swapb:near, strlen:near
  15. extrn    pickstring:near, $tpick:near
  16. extrn    display_screen:near
  17.  
  18. include    dataseg.inc
  19. extrn    file_data_ptr:dword
  20. extrn    filesel:word, filesiz:dword, filename:dword, buffersiz:dword
  21. extrn    dirty_bits:byte, no_file_name:byte
  22. extrn    first_row:byte, cur_posn:word, saved_pos:dword
  23. extrn    swapmode_prompt:byte
  24. window_row    db 1
  25. @curseg    ends
  26.  
  27. include    codeseg.inc
  28. ;
  29. ; change between 2- and 4-file modes
  30. ;
  31. swapmode    proc    near
  32.     xor    swapmode_prompt, '2' XOR '4'
  33.     jmp    showfkey
  34. swapmode    endp
  35.  
  36. ;
  37. ; switch active files
  38. ;
  39. switch:
  40.     cmp    swapmode_prompt,'2'
  41.     jne    short four_files
  42.  
  43. ; 2-file mode active
  44. ; swap the files' data areas
  45.     xor    ebx,ebx            ; swap with first hidden file
  46.     inc    ebx
  47.     call    swap_files
  48.  
  49.     ret
  50.  
  51. ; 4-file mode
  52. ; seach all file data areas for filename
  53.  
  54. name_list_ptr    equ    ebp
  55.  
  56. four_files:
  57.     cld
  58.     push    ebp
  59.  
  60. ; make space available for all filenames
  61.     mov    ebx,number_of_files
  62.     shl    ebx,6            ; *64
  63.     inc    ebx
  64.     sys    GetMemNear
  65.     jc    short four_exit
  66.     mov    name_list_ptr,esi    ; save pointer to list of names
  67.  
  68. ; build list of filenames for PICKSTRING
  69.     mov    ecx,number_of_files    ; do for all files
  70.     mov    edx,file_data_ptr
  71.     mov    edi,name_list_ptr
  72.     push    ds
  73.     pop    es            ; ES:[EDI] -> buffer
  74.  
  75. four0:    push    ecx
  76.     mov    esi,[edx]        ; point to filename
  77.     mov    eax,edx            ; point to file data
  78.     add    edx,file_data_len    ; point to other files
  79.     cmp    word ptr [eax+4],0FFFFh    ; file buffer allocated?
  80.     je    short four1        ;  skip if not
  81.  
  82.     cmp    byte ptr [esi],0    ; len(filename) > 0?
  83.     jne    short four2        ;  skip if so
  84. four1:    lea    esi,no_file_name
  85. four2:    mov    ebx,esi
  86.     call    strlen            ; get length of string
  87.     inc    ecx            ; include the NUL
  88.     rep    movsb            ; copy to buffer
  89.     pop    ecx
  90.     loop    four0
  91.     mov    al,cl
  92.     stosb
  93.  
  94.     mov    dx,0707h
  95.     mov    esi,name_list_ptr
  96.     xor    ebx,ebx
  97.     mov    eax,offset @curseg:$tpick
  98.     call    pickstring
  99.     cmp    ax,27            ; ESC key?
  100.     je    short four9
  101.  
  102.     or    ebx,ebx
  103.     jz    short four9
  104.     call    swap_files
  105. four9:
  106.     mov    esi,name_list_ptr
  107.     sys    RelMemNear        ; release memory
  108. four_exit:
  109.     pop    ebp
  110.     clc
  111.     ret
  112.  
  113.  
  114. swap_files:
  115.     cld
  116.  
  117. ; put hidden file at top of screen
  118.     mov    dl,first_row
  119.     dec    dl
  120.     jz    short sw00
  121.  
  122.     pushad
  123.     sub    byte ptr cur_posn+1,dl
  124.     sub    first_row,dl
  125.     or    dirty_bits,00100001b
  126.     mov    saved_pos,-1
  127.     call    display_screen
  128.     popad
  129. sw00:
  130.     push    ds
  131.     pop    es
  132.     mov    eax,file_data_len
  133.     mul    bx            ; offset in stored file data
  134.     movzx    eax,ax
  135.     mov    esi,file_data_ptr    ; DS:[ESI] -> active file's data
  136.     mov    edi,esi
  137.     add    edi,eax            ; ES:[EDI] -> next file's data
  138.     mov    ecx,file_data_len
  139.     call    swapb
  140.  
  141. ; see if memory buffer has been allocated
  142.     cmp    filesel,0FFFFh
  143.     jne    short sw01        ; already allocted - skip
  144.     mov    ecx,1024
  145.     sys    GetMem32        ; allocate new selector
  146.     mov    filesel,bx
  147.     mov    filesiz,0
  148.     mov    buffersiz,1024
  149.  
  150. ; allocate filename buffer
  151.     mov    ebx,64
  152.     sys    GetMemNear
  153.     mov    filename,esi
  154.     mov    byte ptr [esi],0    ; start with NUL filename
  155.  
  156. sw01:
  157. ; move active file to active window
  158.     mov    dl,window_row
  159.     dec    dl
  160.     add    first_row,dl
  161.     add    byte ptr cur_posn+1,dl
  162.     mov    fs,filesel
  163.     or    dirty_bits,00100001b    ; flag to update screen & top line
  164.     push    ds
  165.     pop    es
  166.     ret
  167.  
  168. @curseg    ends
  169.     end
  170.